package 线程池.线程池的创建;

import java.util.concurrent.*;

public class Test {
    public static void main(String[] args) {
        // 谁代表了线程池?
        // JDK5.0 起提供了代表线程池的接口: ExecutorService.

        // 如何得到线程池对象?
        // 方式一: 使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象
        // 方式二: 使用Executors(线程池的工具类) 调用方法返回不同特点的线程池对象

        // ThreadPoolExecutor构造器
        // public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable>
        // workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

        // 参数一: corePoolSize: 指定线程的核心线程的数量.
        // 参数二: maximumPoolSize: 指定吸纳成池的最大线程数量.
        // 参数三: keepAliveTime: 指定临时线程的存活时间.
        // 参数四: unit: 指定临时线程存活的时间单位(秒, 分, 时, 天)
        // 参数五: workQueue: 指定线程池的任务队列.
        // 参数六: threadFactory: 指定线程池的线程工厂.(创建核心或临时线程)
        // 参数七: 指定线程池的任务拒绝策略 (线程都在忙, 任务队列也满了的时候, 新任务来了该怎么处理)


//        public ThreadPoolExecutor(int corePoolSize,
//        int maximumPoolSize,
//        long keepAliveTime,
//        TimeUnit unit,
//        BlockingQueue<Runnable> workQueue,
//        ThreadFactory threadFactory,
//        RejectedExecutionHandler handler) // 记不住时, 可以进入源代码看格式
        // 1. 通过ThreadPoolExecutor创建一个线程池对象
        ExecutorService pool1 = new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
                                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); // 这里任务队列分两种, 这是第一种, LinkedBlocking Queue<>(): 不限制任务数量
        ExecutorService pool2 = new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS, new ArrayBlockingQueue<>(4),
                                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); // 这里是任务队列的第二种, ArrayBlockingQueue<>(int a): 其中 a就是限制的任务数量

        // 线程池的注意事项
        // 1. 临时线程什么时候创建?
        //    : 新任务提交时发现核心线程都在忙, 任务队列也满了, 并且还可以创建临时线程, 此时才会创建临时线程
        // 2. 什么时候会开始拒绝新任务?
        //    : 核心线程和临时线程都在忙, 任务队列也满了, 新的任务过来的时候才会开始拒绝任务

    }
}
